/* 
 * File:   Salle.cpp
 * Author: poitevjo
 * 
 * Created on 24 novembre 2011, 12:50
 */

#include "Salle.h"
//Constructeur de la classe//
Salle::Salle(Case Casegen,int x,int y,int num) {
    this->num=num;
    this->longueurx=x;
    this->longueury=y;
    this->Casegen=Casegen;
    if(longueurx >= 3 && longueury >= 3){
        this->Generer();
    }
   
}

//Ajout Case//
void Salle::AjouterCase(Case C){
    Cases.push_back(C);
}
///////////////////////////Methodes d'affichages////////////////////////////////
//Affiche la salle sans tenir compte des position x,y//
void Salle::Afficher(){
    int i,j;
        cout << "Voici la salle numero : " << num << endl;
        cout << "Longueur sur les x : " << longueurx << endl;
        cout << "Longueur sur les y : " << longueury << endl;
        if(longueurx >= 3 && longueury >= 3){

                for(i=0;i<=longueury-1;i++){
        
                        for(j=0;j<=longueurx-1;j++){
                        cout << Cases[i*longueurx+j].getsymbole();
                        }
                        cout << endl;
                }
        }
        else{
            cout << "Cette salle est vide !" << endl;
        }

}

//Affiche les infos de chacune des cases de la salle//
void Salle::AfficherCases(){
    int it;
    for(it=0;it<Cases.size();it++){
        Cases[it].Afficher();
    }
}
////////////////////////////////////////////////////////////////////////////////

//Methode de test de la classe//
void Salle::Saisir(){
    cout << "Veuillez saisir la case génératrice : " << endl ;
    Casegen.Saisir();
    cout << "Veuillez saisir la longueur sur les x : " << endl;
    cin >> longueurx;
    cout <<"Veuillez saisir la longueur sur les y : " << endl;
    cin >> longueury;
    this->Generer();

}

//Genere les Case composant la salle selon longueurx,longueury et Casegen// 
void Salle::Generer(){
    int i,j;
    Case C;
    Cases.clear();
    for(i=0;i<=longueury-1;i++){       
        
        for(j=0;j<=longueurx-1;j++){
            
            
            
            if(i==0){
                //Creation de la première ligne
                if(j==0){
                    C = Case(Casegen.getx()+j,Casegen.gety()+i,SymCroi);
                    this->AjouterCase(C);
 
                }
                
                else if(j==longueurx-1){
                    C = Case(Casegen.getx()+j,Casegen.gety()+i,SymCroi);
                    this->AjouterCase(C);

                }
                else{
                    C = Case(Casegen.getx()+j,Casegen.gety()+i,SymMurHor);
                    this->AjouterCase(C);
                                            
                }
              }
            
            
            
            
            else if(i==longueury-1){
                //Creation de la dernière lign
                if(j==0){
                    C = Case(Casegen.getx()+j,Casegen.gety()+i,SymCroi);
                    this->AjouterCase(C);

                }
                else if(j==longueurx-1){
                    C = Case(Casegen.getx()+j,Casegen.gety()+i,SymCroi);
                    this->AjouterCase(C);

                }
                else{
                    C = Case(Casegen.getx()+j,Casegen.gety()+i,SymMurHor);
                    this->AjouterCase(C);
                    
                }
               
            }
            
            
            
            else{
                //Creation des lignes intermediaires
                if(j==0){
                    C = Case(Casegen.getx()+j,Casegen.gety()+i,SymMurVer);
                    this->AjouterCase(C);
                }
                
                else if(j==longueurx-1){
                    C = Case(Casegen.getx()+j,Casegen.gety()+i,SymMurVer);
                    this->AjouterCase(C);                   
                }
                
                else{
                    C = Case(Casegen.getx()+j,Casegen.gety()+i,SymVide);
                    this->AjouterCase(C);
                }
            }
            
        }
    }

    cout << "Salle généré" << endl;
}

//retourne vrai si la salle en parametre est identique//
bool Salle::EstIdentique(Salle S){
    return(S.getlongueurx() == this->longueurx
         &&S.getlongueury() == this->longueury
         &&S.getCasegen().getx() == this->Casegen.getx()
         &&S.getCasegen().gety() == this->Casegen.gety()            
           );
}
//////////////////////////Methodes Ascesseurs///////////////////////////////////
//Retourne Cases//
vector<Case> Salle::getCases(){
    return Cases;
}

//retourne longueurx//
int Salle::getlongueurx(){
    return longueurx;
}

//retourne longueury//
int Salle::getlongueury(){
    return longueury;
}
//retourne Casegen//
Case Salle::getCasegen(){
    return Casegen;
}

